Flexibilidade: Funções de Base, Polinômios, Splines e Séries
Nas últimas aulas, escolhemos
\[ \mathcal G_{\text{linear}} = \{g(x)=\beta_0+\beta_1x\} \]
e aprendemos os parâmetros por mínimos quadrados.
Mas os resíduos mostraram algo importante:
\[ \boxed{\text{uma reta pode ser simples demais para representar }r(x)} \]
Hoje vamos aumentar a flexibilidade dos modelos.
| Modelo | Ideia em uma frase | Controle de complexidade |
|---|---|---|
| Reta | uma linha reta para tudo | quais variáveis usar |
| Polinômio | curva usando potências de \(x\) | grau \(p\) |
| Spline | pedaços de curva emendados com suavidade | número de nós |
| Smoothing spline | curva livre, com multa por zigue-zague | \(\lambda\) |
| Séries ortogonais | soma de peças básicas independentes | número de termos \(m\) |
Como aumentar a flexibilidade do modelo usando representações mais ricas das covariáveis?
Vamos construir a sequência
\[ \boxed{\text{reta}} \rightarrow \boxed{\text{polinômios}} \rightarrow \boxed{\text{splines}} \rightarrow \boxed{\text{suavização}} \]
O mesmo problema ajustado por modelos de complexidade crescente
Uma primeira extensão é
\[ g(x) = \beta_0+\beta_1x+\beta_2x^2+\cdots+\beta_px^p \]
Para \(p=1\), recuperamos a reta.
Para \(p>1\), permitimos curvatura.
Sim. O modelo é não linear em \(x\), mas continua linear nos parâmetros:
\[g(x) = \beta_0 + \beta_1 b_1(x) + \cdots + \beta_d b_p(x), \qquad b_j(x) = x^j\]
Exemplo: ajustar \(g(x) = \beta_0 + \beta_1 x + \beta_2 x^2\) é exatamente uma regressão linear com duas variáveis: as potências de \(x\) são só colunas novas na sua tabela.
| \(x\) | \(x^2\) | \(y\) |
|---|---|---|
| 1 | 1 | 3.2 |
| 2 | 4 | 5.1 |
| 3 | 9 | 8.9 |
| 4 | 16 | 12.4 |
A ideia geral é substituir \(x\) por novas representações:
\[ x \longrightarrow \big( b_1(x),b_2(x),\ldots,b_K(x) \big) \]
Depois ajustamos
\[ g(x)= \beta_0+\sum_{k=1}^{K}\beta_kb_k(x) \]
Muitos modelos aparentemente diferentes podem ser entendidos como regressão linear sobre diferentes funções de base.
Vamos usar \(x=\log(PIB/1000)\) para visualizar claramente o efeito da complexidade.
Aumentar o grau aumenta a flexibilidade da classe.
Em
\[ g_p(x)=\beta_0+\sum_{j=1}^{p}\beta_jx^j, \]
os coeficientes
\[ \beta_0,\ldots,\beta_p \]
são estimados durante o treinamento.
O grau \(p\) define a complexidade da classe antes do ajuste.
Para um grau fixado:
\[ \widehat{\boldsymbol\beta}_p = \arg\min_{\boldsymbol\beta} RSS_p(\boldsymbol\beta) \]
Mas ainda precisamos escolher \(p.\)
Portanto existem dois problemas diferentes:
\[ \boxed{\text{estimar parâmetros}} \qquad\text{e}\qquad \boxed{\text{selecionar complexidade}} \]
À medida que ampliamos a classe de modelos,
\[ \mathcal G_1 \subset \mathcal G_2 \subset \cdots, \]
o erro mínimo de treinamento não pode aumentar:
\[ RSS_{p+1}\le RSS_p \]
Isso parece ótimo…
\[ \boxed{ \text{mais flexível} \not\Rightarrow \text{melhor generalização} } \]
A complexidade precisa ser escolhida com dados que não estejam sendo usados para estimar os coeficientes.
Polinômios são funções globais.
Alterar um coeficiente pode modificar a curva em praticamente todo o domínio.
Além disso, nas extremidades:
A flexibilidade excessiva pode aumentar a variabilidade do estimador.
Pause e responda antes de seguir:
descer
não necessariamente: pode até piorar
escolhido antes: é um hiperparâmetro
são globais: mudanças locais afetam a curva inteira
Em vez de usar uma única função complexa em todo o domínio, podemos construir funções por partes.
Ideia:
\[ \boxed{ \text{ajustes locais} + \text{restrições de continuidade} } \]
Isso nos leva aos splines.
Escolha nós
\[ \xi_1,\xi_2,\ldots,\xi_K \]
Uma base simples usa
\[ (x-\xi_k)_+ = \begin{cases} x-\xi_k, & x>\xi_k,\\ 0, & x\le\xi_k \end{cases} \]
e
\[ g(x)= \beta_0+\beta_1x+ \sum_{k=1}^K\gamma_k(x-\xi_k)_+ \]
Um nó permite que a inclinação mude a partir de determinada região.
Antes do nó:
\[ \text{inclinação}=\beta_1 \]
Depois:
\[ \text{inclinação}=\beta_1+\gamma_k \]
Assim, ganhamos flexibilidade local.
Funções lineares por partes apresentam mudanças abruptas de inclinação.
Cada linha vertical representa um nó.
Cada nó ativa um termo \((x - \xi_k)_+\).
A função é contínua, mas sua inclinação muda nesses pontos.
No spline linear, temos
\[ g(\xi_k^-) = g(\xi_k^+), \]
ou seja, a função é contínua.
No entanto,
\[ g'(\xi_k^-) \neq g'(\xi_k^+), \]
o que implica mudanças abruptas na inclinação.
Em muitas aplicações, deseja-se que a função estimada varie de forma mais suave.
Splines cúbicos usam polinômios de grau 3 em cada região e impõem suavidade nas junções.
Tipicamente exigimos continuidade de:
\[ g(x),\qquad g'(x),\qquad g''(x) \]
Uma forma conveniente de escrever o spline cúbico é
\[ g(x) = \beta_0 + \beta_1 x + \beta_2 x^2 + \beta_3 x^3 + \sum_{k=1}^{K} \gamma_k (x - \xi_k)_+^3 \]
\[ (x-\xi_k)_+^3 = \begin{cases} (x-\xi_k)^3 , & x>\xi_k,\\ 0, & x\le\xi_k \end{cases} \]
Cada nó introduz uma modificação local na curvatura da função.
Dado \((x_i,y_i)\), estimamos
\[ \hat{\beta} = \arg\min \sum_{i=1}^n (y_i - g(x_i))^2 \]
O problema permanece linear nos parâmetros.
\[ g(x)=\sum_{j=0}^p\beta_jx^j \]
\[ g(x)=\sum_{k=1}^K\beta_kb_k(x) \]
Mais nós:
\[ \Rightarrow \text{maior flexibilidade}. \]
Menos nós:
\[ \Rightarrow \text{curva mais rígida}. \]
Surge novamente o mesmo problema:
\[ \boxed{\text{como controlar a complexidade?}} \]
Em vez de escolher poucos nós, podemos permitir uma função bastante flexível e penalizar curvas excessivamente irregulares.
A ideia é buscar pela função \(g\) que minimiza
\[ \boxed{ \sum_{i=1}^{n} (y_i-g(x_i))^2 + \lambda \int [g''(t)]^2dt } \]
Esse é o princípio do smoothing spline.
\[ \underbrace{ \sum_i(y_i-g(x_i))^2 }_{\text{ajuste aos dados}} + \lambda \underbrace{ \int[g''(t)]^2dt }_{\text{rugosidade}} \]
O parâmetro \(\lambda\) controla o compromisso entre ajuste e suavidade.
Novamente:
Treinamento
estima os coeficientes que definem a curva.
Seleção de modelo
escolhe o nível de suavização.
\[ \boxed{ \lambda\ \text{ou spar} \quad\longleftrightarrow\quad \text{complexidade} } \]
Outra estratégia para estimar uma função desconhecida é representá-la em uma base:
\[ f(x)=\sum_{j=1}^{\infty}\theta_j\phi_j(x) \]
Na prática, truncamos a expansão:
\[ \boxed{ f_m(x)=\sum_{j=1}^{m}\theta_j\phi_j(x) } \]
e estimamos apenas os primeiros \(m\) coeficientes.
As funções da base satisfazem, para um produto interno apropriado,
\[ \langle\phi_j,\phi_k\rangle=0, \qquad j\neq k \]
Isso reduz a interferência entre os componentes da representação.
Exemplos incluem bases trigonométricas e famílias de polinômios ortogonais.
Em uma formulação simples,
\[ \widehat\theta_j = \frac1n\sum_{i=1}^{n}Y_i\phi_j(X_i) \]
Assim,
\[ \widehat f_m(x) = \sum_{j=1}^{m}\widehat\theta_j\phi_j(x) \]
O número de termos \(m\) controla a complexidade.
\[ m\text{ pequeno} \Rightarrow \text{representação rígida} \Rightarrow Bias\uparrow \]
\[ m\text{ grande} \Rightarrow \text{representação flexível} \Rightarrow Var\uparrow \]
Portanto, \(m\) é um hiperparâmetro.
Ele não é aprendido dos dados como \(\widehat\theta_j\), é escolhido antes, por validação.
Aproximação global:
\[ f_m(x)=\sum_{j=1}^{m}\theta_j\phi_j(x) \]
Cada função de base pode atuar sobre todo o domínio.
Aproximação por partes, com comportamento controlado por nós.
Mudanças locais podem ter efeito mais localizado.
As duas estratégias são exemplos de expansões em funções de base.
Polinômios, splines, smoothing splines e LOESS (veremos adiante) parecem métodos diferentes.
Mas todos respondem à mesma pergunta:
\[ \boxed{ \text{quanta flexibilidade devemos permitir a }\widehat g? } \]
\[ \text{Reta} \longrightarrow \text{Polinômio} \longrightarrow \text{Spline} \longrightarrow \text{Suavizador muito local} \]
À medida que a flexibilidade aumenta:
Não devemos escolher grau, número de nós ou suavização observando apenas o erro de treinamento.
A lógica correta é
\[ \boxed{ \text{candidatos} \rightarrow \text{validação} \rightarrow \text{seleção} \rightarrow \text{teste final} } \]
Essa lógica será usada repetidamente ao longo da disciplina.
| Método | Controle principal de flexibilidade |
|---|---|
| Regressão linear | número/forma das covariáveis |
| Polinomial | grau \(p\) |
| Spline de regressão | número/posição dos nós |
| Smoothing spline | penalização \(\lambda\) |
| LOESS |
span (veremos adiante)
|
Ajustar
\[ \boxed{ g(x)=\beta_0+\sum_{k=1}^{K}\beta_kb_k(x) } \]
é uma ideia extremamente poderosa.
Mudando as funções de base e o controle de complexidade, obtemos diferentes famílias de modelos.
Observe que, o que fizemos, foi trocar o dado original por um vetor de representações:
\[\boldsymbol\phi(x) = (\phi_1(x), \ldots, \phi_K(x))^t\]
A representação pode ser utilizada tanto por um modelo de regressão quanto por um classificador probabilístico.
\[x \longrightarrow \boldsymbol\phi(x) \longrightarrow \begin{cases} \text{regressão (resposta contínua)} \\ \text{classificador (resposta categórica)} \end{cases}\]
A transformação não sabe nem se importa com o que vem depois: ela é agnóstica ao modelo final.
A representação pode ser utilizada tanto por um modelo de regressão quanto por um classificador probabilístico
EST335 — Semana 3